使用 Application Insights 监控应用程序
在开发和部署应用程序到云端后,监控和诊断应用程序的运行状态变得至关重要。Azure Application Insights 服务为维护应用程序提供了一套完整的工具集,支持多语言和多平台的 SDK、警报功能、查询语言,还能与许多原生 Azure 服务集成。它简化了应用程序的日志记录,避免了在分析问题时依赖多个数据源。
1. 技术要求
要进行相关操作,你需要具备以下条件:
- 一个 Azure 订阅
- 安装了以下工作负载的 Visual Studio:ASP.NET、Web 开发和 Azure 开发
2. 使用 Azure Application Insights 服务
开发应用程序(特别是云托管应用)时,能够轻松监控并尽早发现潜在问题和缺陷是非常重要的特性。传统方式需要一套完整的日志记录器、存储和报告工具架构,并且需要团队具备额外的技能进行集成、配置和日常维护,这不仅耗时,而且应用程序越大,所需的工作量就越大。而使用 Azure Application Insights,这些操作变得简单许多,你只需一个服务和端点就能记录所有所需信息,其余工作会自动完成。
2.1 云端数据日志记录
假设你拥有包含多个不同 Web 应用、不同存储功能(如 SQL 数据库或 Azure 存储)以及 Azure Functions 的架构。若要监控这些服务,需要以下组件:
- 一个能使用不同输出(如存储或文件,可能支持多平台)的日志保存工具
- 能够存储千兆字节日志数据的存储
- 一个从存储获取数据并使用不同过滤器和参数进行展示的仪表板
然而,考虑这些组件时会遇到一些问题:
- 仅存储原始数据是不够的,还需要某种投影视图,以便快速获取数据且无需额外转换或处理。
- 必须找到一种存储数据的方式,允许用户根据不同维度随意查询。虽然追加日志便于查看近期记录,但对于创建动态参数索引并不理想。
- 需要实现某种数据保留策略,因为大多数日志在固定时间段后就失去了作用。
- 应用程序和报告解决方案的性能应具有可重复性,且不会随时间(如存储数据量的增加)而改变。
- 组建专门的问题跟踪团队可能不是最佳的资源分配方式,具备报告和数据分析技能的人员在处理实际业务数据时更有价值。
Azure Application Insights 就是解决上述问题的理想方案。
2.2 Azure Application Insights 基础
连接到 Azure Application Insights 服务的方式取决于具体情况,一般有以下几种集成方式:
-
门户无缝集成
:无需额外步骤,只需启用并配置功能,其余部分已实现。
-
根据平台使用适当的 SDK
:需要从门户获取一个检测密钥。
-
直接向服务端点发送遥测事件
:使用 REST API 时,有 App ID、密钥或 OAuth2 流等不同选项。
不同的日志记录方法可能会提供不同的功能和能力,特别是发送自定义事件或自定义日志逻辑时,通常需要使用专用的 SDK。
Azure Application Insights 除了具备记录和存储请求或异常信息等基本功能外,还实现了许多其他功能:
-
请求遥测
:可自动收集请求计数、平均延迟和失败率等信息。例如,将其与 Azure App Services 结合使用时,只需实现 SDK 就能全面了解 Web 应用程序。
-
依赖项
:能查看应用程序依赖项(如 Azure 表存储和 Azure SQL)的性能,特别是在集成多个服务时,可找出对延迟影响最大的服务。
-
异常
:详细的错误聚合数据仪表板能让你轻松查看与特定请求子集相关的错误类型,从而更好地了解应用程序内部的运行情况并确定修复起点。
-
用户遥测
:可获取用户和会话计数、用户行为以及总体活动等信息。
此外,还有收集 AJAX 调用、页面视图和 Web 性能信息、虚拟机性能计数器以及 Docker 主机诊断等功能。功能的可用性还取决于所选的服务,Azure Functions 和 Azure App Services 收集的遥测数据会有所不同。
2.3 在门户中创建 Azure Application Insights
要创建 Azure Application Insights 实例,需在市场中搜索该服务,并填写一个简单的表单,其中有一个可能不常见的字段:
-
应用程序类型
:根据选择(ASP.NET Web 应用程序、Java、App Center、Node.js 或通用),会选择不同的图表集。此选项不影响服务的可用功能,而是确保在特定实例中仅显示你最感兴趣的信息。
与大多数 Azure 服务不同,Azure Application Insights 不要求所有实例的服务名称全局唯一,只需在同一服务内不使用相同名称即可,因为它不使用 DNS 名称来与其他应用程序通信和连接。
点击“创建”后,很快就能完成新服务实例的预配。实例默认隐藏了“基本信息”部分,其中包含一些常见元数据,更重要的是检测密钥和标识符,用于实际连接到 Azure Application Insights。
3. 监控不同平台
Azure Application Insights 的强大之处在于它能同时监控不同平台,支持 ASP.NET 页面、Java、Node.js,甚至 Python 或 Ruby(部分语言和框架由官方支持,部分由社区支持),具有平台无关性。借助检测密钥,你可以轻松地将数据发送到服务实例,无需额外的密钥和复杂配置。
3.1 .NET
在 .NET 应用程序中,开始使用 Azure Application Insights 只需安装最新的 Microsoft.ApplicationInsights 包。可以使用以下代码片段:
TelemetryConfiguration.Active.InstrumentationKey = "<instrumentation-key>";
var telemetryClient = new TelemetryClient();
这段代码的作用如下:
- 通过提供检测密钥设置当前配置,这是连接到服务所需的全部操作。
- 初始化 TelemetryClient 实例,该类是服务的代理,用于与服务进行通信。
然后可以使用不同的方法记录数据:
telemetryClient.TrackTrace("Hello World!");
telemetryClient.TrackException(new Exception());
telemetryClient.TrackDependency(new DependencyTelemetry());
实际上,TelemetryConfiguration 提供的配置数据最初是从 ApplicationInsights.config 文件中获取的,该文件示例如下:
<?xml version="1.0" encoding="utf-8"?>
<ApplicationInsights
xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings">
<InstrumentationKey>8sad7asd-asd876asf-jr323jsd-3hshjahj</InstrumentationKey>
<TelemetryInitializers>
<Add
Type="Microsoft.ApplicationInsights.DependencyCollector.HttpDependenciesParsingTelemetryInitializer, Microsoft.AI.DependencyCollector"/>
</TelemetryInitializers>
<TelemetryModules>
<Add
Type="Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModule, Microsoft.AI.DependencyCollector">
<ExcludeComponentCorrelationHttpHeadersOnDomains>
</ExcludeComponentCorrelationHttpHeadersOnDomains>
<IncludeDiagnosticSourceActivities>
<Add>Microsoft.Azure.ServiceBus</Add>
<Add>Microsoft.Azure.EventHubs</Add>
</IncludeDiagnosticSourceActivities>
</Add>
</TelemetryModules>
<TelemetryChannel
Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.ServerTelemetryChannel, Microsoft.AI.ServerTelemetryChannel"/>
</ApplicationInsights>
如果该文件不存在或不包含所有值,则配置将不正确,此时需要手动提供配置。需要注意的是,上述说明仅适用于使用 .NET 框架的情况。
除了控制台应用,还可以在其他应用类型中使用,如 Windows 桌面应用:
public partial class Form1 : Form
{
private TelemetryClient _telemetryClient = new TelemetryClient();
private void Form1_Load(object sender, EventArgs e)
{
_telemetryClient.InstrumentationKey = "<instrumenation-key>";
_telemetryClient.Context.User.Id = Environment.UserName;
_telemetryClient.Context.Session.Id = Guid.NewGuid().ToString();
_telemetryClient.Context.Device.OperatingSystem = Environment.OSVersion.ToString();
_telemetryClient.TrackPageView("Form1");
}
}
也可以使用与 Azure Application Insights 无缝集成的 Web 应用。
3.2 Node.js
在 Node.js 中使用 Azure Application Insights,需要运行以下命令安装 NPM 包:
npm install applicationinsights
以下是该包接口的完整示例:
let http = require("http");
let appInsights = require("applicationinsights");
appInsights.setup("<instrumentation-key>");
appInsights.start();
let client = appInsights.defaultClient;
client.trackEvent({name: "my custom event", properties: {customProperty: "custom property value"}});
client.trackException({exception: new Error("handled exceptions can be logged with this method")});
client.trackMetric({name: "custom metric", value: 3});
client.trackTrace({message: "trace message"});
client.trackDependency({target:"http://dbname", name:"select customers proc", data:"SELECT * FROM Customers", duration:231, resultCode:0, success: true, dependencyTypeName: "ZSQL"});
client.trackRequest({name:"GET /customers", url:"http://myserver/customers", duration:309, resultCode:200, success:true});
http.createServer( (req, res) => {
client.trackNodeHttpRequest({request: req, response: res});
}).listen(1337, "127.0.0.1");
console.log('Server running at http://127.0.0.1:1337/');
运行该示例后,你会看到最初的请求被记录下来。
3.3 Azure Functions
Azure Application Insights 还与 Azure Functions 实现了无缝集成,有两种启用集成的方式:
- 在创建服务时开启。
- 在设置中手动提供检测密钥。
不过,这种设置有一个注意事项:如果已经有一个服务实例,就无法直接选择该实例,需要在 Function App 的设置中手动提供 APPINSIGHTS_INSTRUMENTATIONKEY 来启用集成。另外,还可以在未启用经典视图的情况下,点击任何函数的“监控”选项卡,然后选择“配置”来启用集成。启用集成后,就可以分析所有查询的执行情况。
4. Analytics 模块
Azure Application Insights 不仅提供了多种与不同服务(包括自定义应用)集成的方式,其 Analytics 模块中的分析语言也是一项重要且关键的功能。这是一种交互式查询语言,使用简单直观的语法,让你可以轻松探索记录的数据。而且,一旦存储了跟踪信息、异常或请求,无需额外工具,只需编写查询即可使用该功能。
4.1 访问 Analytics 模块
访问 Analytics 模块非常简单,只需转到 Azure Application Analytics 实例的“概述”面板,然后点击“Analytics”按钮,就会显示一个新窗口,提供输入查询、使用预定义查询或探索不同维度的选项。
其中,查询窗口是一个交互式功能,支持编写查询,并提供语法验证和建议等额外功能。以下是一个简单的查询示例,用于显示过去几天的请求计数:
requests
| summarize totalCount=sum(itemCount) by bin(timestamp, 30m)
| render timechart
该查询分为三个部分:
-
requests
:要查询的维度
-
summarize
:定义从维度中获取的数据
-
render
:一个可选函数,用于根据数据绘制图表
当然,查询可以有不同的结构,下面是一个更复杂的示例:
requests
| summarize RequestsCount=sum(itemCount), AverageDuration=avg(duration), percentiles(duration, 50, 95, 99) by operation_Name
| order by RequestsCount desc
这个查询不会生成图表,而是显示一个表格。
查询时,日期范围很重要,你可以通过点击“运行”按钮旁边的“时间范围”按钮来选择感兴趣的日期。
Azure Application Analytics 的查询语言非常丰富,定义了许多针对不同数据类型和操作的函数(例如可以使用多种窗口函数)。此外,执行查询时,还可以根据结果选择额外的过滤器来选择特定记录。
4.2 智能分析功能
Analytics 模块还有一个有用的功能——智能分析,它通过引入机器学习元素来扩展分析能力。目前提供以下功能:
-
Autocluster
:自动将数据划分为集群,便于理解。
-
Basket
:自动在查询结果中找到有趣的数据。
-
Diffpatterns
:对存储布尔值的列进行操作,尝试找出对应差异的模式。
-
Timer series
:(make-series 函数)将数据转换为单行,便于分析问题的根本原因。
-
Linear regression
:根据结果轻松找到数据趋势(例如异常数量是否增长)。
-
Outlier value detection
:找出与其他值相比异常的值。
这些高级功能可以大大提高数据分析的效率,使整个服务更加灵活,而且无需成为数据科学家就能进行数据分析、发现趋势和异常。
5. Application Insights 自动化
日常监控工作往往比较繁琐,服务的自动化程度越高,效果就越好。让机器根据预设规则检查不同维度并发现问题,不仅速度更快,而且更细致。在 Azure Application Insights 中,有多种自动化选项可供选择,如 ARM 模板、门户中的警报或集成外部服务(如 Microsoft Flow)。通过自动化,你可以将更多精力放在开发上,而不是日志分析和服务维护上。
使用 Application Insights 监控应用程序
5.1 ARM 模板自动化部署
ARM(Azure Resource Manager)模板可以用于自动化部署 Azure Application Insights 资源。通过编写 JSON 格式的模板,你可以定义资源的配置和依赖关系,实现快速、一致的部署。以下是一个简单的 ARM 模板示例:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"appInsightsName": {
"type": "string",
"defaultValue": "myAppInsights",
"metadata": {
"description": "The name of the Application Insights resource."
}
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]",
"metadata": {
"description": "The location in which to create the Application Insights resource."
}
}
},
"resources": [
{
"type": "microsoft.insights/components",
"apiVersion": "2020-02-02-preview",
"name": "[parameters('appInsightsName')]",
"location": "[parameters('location')]",
"kind": "web",
"properties": {
"Application_Type": "web"
}
}
]
}
使用 ARM 模板部署的步骤如下:
1. 准备好上述 ARM 模板文件,保存为
azuredeploy.json
。
2. 打开 Azure PowerShell 或 Azure CLI。
3. 使用以下命令进行部署(以 Azure CLI 为例):
az deployment group create --resource-group <resource-group-name> --template-file azuredeploy.json
其中
<resource-group-name>
是你要部署资源的资源组名称。
5.2 门户中的警报设置
在 Azure 门户中设置警报可以帮助你及时发现应用程序的异常情况。以下是设置警报的步骤:
1. 打开 Azure Application Insights 实例。
2. 在左侧导航栏中,点击“警报”。
3. 点击“新建警报规则”。
4. 在“定义警报条件”部分:
- 选择要监控的信号,如请求失败率、平均响应时间等。
- 设置阈值,当指标超过该阈值时触发警报。
- 选择评估频率和时段。
5. 在“定义操作组”部分:
- 可以选择现有的操作组,或者创建新的操作组。
- 操作组定义了警报触发时要执行的操作,如发送电子邮件、短信、调用 Webhook 等。
6. 在“定义警报详细信息”部分:
- 输入警报规则的名称和描述。
- 选择警报的严重级别。
7. 点击“创建警报规则”完成设置。
5.3 集成外部服务(以 Microsoft Flow 为例)
Microsoft Flow 可以与 Azure Application Insights 集成,实现自动化的工作流。例如,当检测到应用程序的异常时,自动创建一个任务或发送通知。以下是集成步骤:
1. 打开 Microsoft Flow。
2. 创建一个新的流,选择“自动化 - 从空白创建”。
3. 在搜索框中输入“Azure Application Insights”,选择合适的触发器,如“当指标警报触发时”。
4. 配置触发器的参数,如选择要监控的 Application Insights 实例和警报规则。
5. 添加操作步骤,例如发送电子邮件通知、创建 Microsoft Teams 消息或创建 SharePoint 任务等。
6. 配置操作步骤的参数,如收件人、消息内容等。
7. 保存并启用流。
总结
Azure Application Insights 为监控和诊断应用程序提供了全面而强大的解决方案。它支持多种平台的集成,通过简单的配置和代码实现,就能收集丰富的应用程序数据,包括请求遥测、依赖项信息、异常数据和用户行为等。Analytics 模块的查询语言和智能分析功能,让你可以深入挖掘数据,发现潜在的问题和趋势。同时,自动化功能,如 ARM 模板部署、门户警报设置和外部服务集成,大大提高了监控效率,使你能够将更多的精力投入到应用程序的开发和优化中。
以下是一个简单的流程图,展示了使用 Azure Application Insights 监控应用程序的主要流程:
graph LR
A[应用程序开发与部署] --> B[集成 Azure Application Insights]
B --> C{选择集成方式}
C -->|门户无缝集成| D1[启用配置功能]
C -->|使用 SDK| D2[获取检测密钥并配置]
C -->|发送遥测事件| D3[使用 REST API 配置]
D1 --> E[收集数据]
D2 --> E
D3 --> E
E --> F[存储数据]
F --> G[使用 Analytics 模块查询分析数据]
G --> H[设置自动化功能]
H --> I[及时发现并解决问题]
通过合理利用 Azure Application Insights 的各项功能,你可以更好地了解应用程序的运行状况,保障应用程序的稳定性和性能,为用户提供更好的体验。
超级会员免费看
361

被折叠的 条评论
为什么被折叠?



