24、使用 Application Insights 监控应用程序

使用 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 的各项功能,你可以更好地了解应用程序的运行状况,保障应用程序的稳定性和性能,为用户提供更好的体验。

【顶级EI完整复现】【DRCC】考虑N-1准则的分布鲁棒机会约束低碳经济调度(Matlab代码实现)内容概要:本文介绍了名为《【顶级EI完整复现】【DRCC】考虑N-1准则的分布鲁棒机会约束低碳经济调度(Matlab代码实现)》的技术资源,聚焦于电力系统中低碳经济调度问题,结合N-1安全准则与分布鲁棒机会约束(DRCC)方法,提升调度模型在不确定性环境下的鲁棒性和可行性。该资源提供了完整的Matlab代码实现,涵盖建模、优化求解及仿真分析全过程,适用于复杂电力系统调度场景的科研复现与算法验证。文中还列举了大量相关领域的研究主题与代码资源,涉及智能优化算法、机器学习、电力系统管理、路径规划等多个方向,展示了广泛的科研应用支持能力。; 适合人群:具备一定电力系统、优化理论和Matlab编程基础的研究生、科研人员及从事能源调度、智能电网相关工作的工程师。; 使用场景及目标:①复现高水平期刊(如EI/SCI)关于低碳经济调度的研究成果;②深入理解N-1安全约束与分布鲁棒优化在电力调度中的建模方法;③开展含新能源接入的电力系统不确定性优化研究;④为科研项目、论文撰写或工程应用提供可运行的算法原型和技术支撑。; 阅读建议:建议读者结合文档提供的网盘资源,下载完整代码与案例数据,按照目录顺序逐步学习,并重点理解DRCC建模思想与Matlab/YALMIP/CPLEX等工具的集成使用方式,同时可参考文中列出的同类研究方向拓展研究思路。
内容概要:本文详细介绍了一个基于MATLAB实现的电力负荷预测项目,采用K近邻回归(KNN)算法进行建模。项目从背景意义出发,阐述了电力负荷预测在提升系统效率、优化能源配置、支撑智能电网和智慧城市建设等方面的重要作用。针对负荷预测中影响因素多样、时序性强、数据质量差等挑战,提出了包括特征工程、滑动窗口构造、数据清洗与标准化、K值与距离度量优化在内的系统性解决方案。模型架构涵盖数据采集、预处理、KNN回归原理、参数调优、性能评估及工程部署全流程,并支持多算法集成与可视化反馈。文中还提供了MATLAB环境下完整的代码实现流程,包括数据加载、归一化、样本划分、K值选择、模型训练预测、误差分析与结果可视化等关键步骤,增强了模型的可解释性与实用性。; 适合人群:具备一定MATLAB编程基础和机器学习基础知识,从事电力系统分析、能源管理、智能电网或相关领域研究的研发人员、工程师及高校师生;适合工作1-3年希望提升实际项目开发能力的技术人员; 使用场景及目标:①应用于短期电力负荷预测,辅助电网调度与发电计划制定;②作为教学案例帮助理解KNN回归在实际工程中的应用;③为新能源接入、需求响应、智慧能源系统提供数据支持;④搭建可解释性强、易于部署的轻量级预测模型原型; 阅读建议:建议结合MATLAB代码实践操作,重点关注特征构造、参数调优与结果可视化部分,深入理解KNN在时序数据中的适应性改进方法,并可进一步拓展至集成学习或多模型融合方向进行研究与优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值