Application Insights for Java 2.x

注意

本文适用于不再推荐使用的 Application Insights Java 2.x。

有关最新版本的文档,可参阅 Application Insights Java 3.x

本文介绍如何使用 Application Insights Java 2.x。 本文介绍如何:

  • 了解入门知识和如何检测请求、跟踪依赖项和收集性能计数器、诊断性能问题和异常,以及编写代码来跟踪用户对你的应用的使用情况。
  • 将跟踪日志发送到 Application Insights 并使用 Application Insights 门户浏览日志。
  • 监视 Java Web 应用中的依赖项、捕获的异常和方法执行时间。
  • 在 Java Web 应用中筛选遥测。
  • 使用 collectd 在 Application Insights 中浏览 Linux 系统性能指标。
  • 度量基于 Java 虚拟机 (JVM) 的应用程序代码的指标。 使用 Micrometer 应用程序监视将数据导出到你偏好的监视系统。

注意

对检测密钥引入的支持将于 2025 年 3 月 31 日结束。 检测密钥引入功能将会继续工作,但我们将不再为该功能提供更新或支持。 转换为连接字符串,以利用新功能

Java Web 项目中的 Application Insights 入门

在本部分,你将使用 Application Insights SDK 检测请求、跟踪依赖项、收集性能计数器、诊断性能问题和异常,并编写代码以跟踪用户对应用执行的操作。

Application Insights 是面向 Web 开发人员的可扩展分析服务,可帮助你了解实时应用程序的性能和使用情况。 Application Insights 支持 Linux、Unix 或 Windows 上运行的 Java 应用。

先决条件

需要:

获取 Application Insights 检测密钥

  1. 登录到 Azure 门户

  2. 在 Azure 门户中,创建 Application Insights 资源。 将应用程序类型设置为 Java Web 应用程序。

  3. 查找新资源的检测密钥。 稍后需要将此密钥粘贴到代码项目中。

    Azure 门户中 Application Insights 资源的“概述”窗格的屏幕截图,其中突出显示了检测密钥。

将用于 Java 的 Application Insights SDK 添加到项目

选择项目类型。

如果项目已设置为使用 Maven 生成,请将以下代码合并到 pom.xml 文件。 然后刷新项目依赖项,以下载库。

    <dependencies>
      <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>applicationinsights-web-auto</artifactId>
        <!-- or applicationinsights-web for manual web filter registration -->
        <!-- or applicationinsights-core for bare API -->
        <version>2.6.4</version>
      </dependency>
    </dependencies>

常见问题

  • -web-auto-web-core 组件之间有怎样的关系?

    • applicationinsights-web-auto 通过在运行时自动注册 Application Insights servlet 筛选器,为你提供跟踪 HTTP servlet 请求计数和响应时间的指标。
    • applicationinsights-web 还提供用于跟踪 HTTP servlet 请求计数和响应时间的指标。 但需要在应用程序中手动注册 Application Insights servlet 筛选器。
    • 例如,如果应用程序不是基于 servlet 的应用程序,则 applicationinsights-core 提供单纯的 API。
  • 应怎样将 SDK 更新到最新版本?

    • 自 2020 年 11 月起,为了监视 Java 应用程序,建议使用 Application Insights Java 3.x。 有关如何入门的详细信息,请参阅 Application Insights Java 3.x

添加 ApplicationInsights.xml 文件

在项目的 resources 文件夹中添加 ApplicationInsights.xml,或确保将其添加到项目的部署类路径。 将以下 XML 复制到其中。

将检测密钥替换为从 Azure 门户获得的密钥。

<?xml version="1.0" encoding="utf-8"?>
<ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings" schemaVersion="2014-05-30">

   <!-- The key from the portal: -->
   <InstrumentationKey>** Your instrumentation key **</InstrumentationKey>

   <!-- HTTP request component (not required for bare API) -->
   <TelemetryModules>
      <Add type="com.microsoft.applicationinsights.web.extensibility.modules.WebRequestTrackingTelemetryModule"/>
      <Add type="com.microsoft.applicationinsights.web.extensibility.modules.WebSessionTrackingTelemetryModule"/>
      <Add type="com.microsoft.applicationinsights.web.extensibility.modules.WebUserTrackingTelemetryModule"/>
   </TelemetryModules>

   <!-- Events correlation (not required for bare API) -->
   <!-- These initializers add context data to each event -->
   <TelemetryInitializers>
      <Add type="com.microsoft.applicationinsights.web.extensibility.initializers.WebOperationIdTelemetryInitializer"/>
      <Add type="com.microsoft.applicationinsights.web.extensibility.initializers.WebOperationNameTelemetryInitializer"/>
      <Add type="com.microsoft.applicationinsights.web.extensibility.initializers.WebSessionTelemetryInitializer"/>
      <Add type="com.microsoft.applicationinsights.web.extensibility.initializers.WebUserTelemetryInitializer"/>
      <Add type="com.microsoft.applicationinsights.web.extensibility.initializers.WebUserAgentTelemetryInitializer"/>
   </TelemetryInitializers>

</ApplicationInsights>

或者,配置文件可以位于应用程序可访问的任何位置。 系统属性 -Dapplicationinsights.configurationDirectory 指定 ApplicationInsights.xml 所在的目录。 例如,将使用属性 -Dapplicationinsights.configurationDirectory="E:\myconfigs\appinsights" 配置位于 E:\myconfigs\appinsights\ApplicationInsights.xml 的配置文件。

  • 检测密钥随遥测的每个项一起发送,并告知 Application Insights 在资源中显示它。
  • HTTP 请求组件是可选的。 它自动将请求和响应时间的遥测数据发送到门户。
  • 事件关联是对 HTTP 请求组件的补充。 它将标识符分配给服务器收到的每个请求。 然后将此标识符作为属性添加到每个遥测项,作为属性 Operation.Id。 使用它可以通过在诊断搜索中设置筛选器,来关联与每个请求关联的遥测。

设置检测密钥的替代方法

Application Insights SDK 按以下顺序查找密钥:

  • 系统属性:-DAPPINSIGHTS_INSTRUMENTATIONKEY=your_ikey
  • 环境变量:APPINSIGHTS_INSTRUMENTATIONKEY
  • 配置文件:ApplicationInsights.xml

也可以 在代码中设置方法

    String instrumentationKey = "00000000-0000-0000-0000-000000000000";

    if (instrumentationKey != null)
    {
        TelemetryConfiguration.getActive().setInstrumentationKey(instrumentationKey);
    }

添加代理

安装 Java 代理以捕获传出的 HTTP 调用、JDBC 查询、应用程序日志记录和更好的操作命名。

运行应用程序

在开发计算机上以调试模式运行应用程序,或将其发布到服务器。

在 Application Insights 中查看遥测数据

Azure 门户中返回到你的 Application Insights 资源。

“概述”窗格中显示了 HTTP 请求数据。 如果未显示该资源,请稍候片刻,然后选择“刷新”。

显示概述示例数据的屏幕截图。

详细了解指标

单击任一图表可查看详细聚合指标。

显示 Application Insights 故障窗格的屏幕截图,其中包含图表。

实例数据

单击特定的请求类型可查看各个实例。

显示钻取到特定示例视图的屏幕截图。

Log Analytics:功能强大的查询语言

随着累积的数据越来越多,可以运行查询来聚合数据以及查找单个实例。 Log Analytics 是一个强大的工具,既可用于了解性能和使用情况,也可用于诊断。

显示 Azure 门户中的 Log Analytics 示例的屏幕截图。

在服务器上安装应用

现在,将应用程序发布到服务器供用户使用,然后查看门户中显示的遥测数据。

  • 请确保防火墙允许应用程序将遥测数据发送到以下端口:

    • dc.services.visualstudio.com:443
    • f5.services.visualstudio.com:443
  • 如果必须通过防火墙路由传出流量,需定义系统属性 http.proxyHosthttp.proxyPort

  • 在 Windows 服务器上,安装:

Azure 应用服务、Azure Kubernetes 服务、VM 配置

若要监视在任何 Azure 资源提供程序上运行的应用程序,最佳且最简单的方法是使用 Application Insights Java 3.x

异常和请求失败

Application Insights Web 筛选器会自动收集未经处理的异常和请求失败。

若要收集有关其他异常的数据,可以在代码中插入对 trackException() 的调用

监视方法调用和外部依赖项

安装 Java 代理,记录指定的内部方法、通过 JDBC 发出的调用以及计时数据,该代理还可用于自动操作命名。

W3C 分布式跟踪

Application Insights Java SDK 现支持 W3C 分布式跟踪

Application Insights 中的遥测关联进一步介绍了传入 SDK 配置。

AI-Agent.xml 文件中定义了传出 SDK 配置。

性能计数器

选择“调查”>“指标”查看一系列性能计数器。

显示 Azure 门户中 Application Insights 资源的“指标”窗格的屏幕截图,其中选择了进程专用字节。

自定义性能计数器收集

若要禁用收集标准性能计数器集,请将以下代码添加到 ApplicationInsights.xml 文件的根节点下:

    <PerformanceCounters>
       <UseBuiltIn>False</UseBuiltIn>
    </PerformanceCounters>

收集更多性能计数器

可以指定要收集的其他性能计数器。

JMX 计数器(由 Java 虚拟机公开)
    <PerformanceCounters>
      <Jmx>
        <Add objectName="java.lang:type=ClassLoading" attribute="TotalLoadedClassCount" displayName="Loaded Class Count"/>
        <Add objectName="java.lang:type=Memory" attribute="HeapMemoryUsage.used" displayName="Heap Memory Usage-used" type="composite"/>
      </Jmx>
    </PerformanceCounters>
  • displayName:Application Insights 门户中显示的名称。
  • objectName:JMX 对象名称。
  • attribute:要提取的 JMX 对象名称属性。
  • type(可选):JMX 对象的属性类型:
    • 默认值:简单类型,例如 int 或 long。
    • composite:性能计数器数据采用 Attribute.Data 格式。
    • tabular:性能计数器数据采用表行格式。
Windows 性能计数器

每个 Windows 性能计数器 是类别的成员(就好比字段是类的成员)。 类别可以是全局的,也可以是带编号的实例或命名实例。

    <PerformanceCounters>
      <Windows>
        <Add displayName="Process User Time" categoryName="Process" counterName="%User Time" instanceName="__SELF__" />
        <Add displayName="Bytes Printed per Second" categoryName="Print Queue" counterName="Bytes Printed/sec" instanceName="Fax" />
      </Windows>
    </PerformanceCounters>
  • displayName:Application Insights 门户中显示的名称。
  • categoryName:与此性能计数器关联的性能计数器类别(性能对象)。
  • counterName:性能计数器的名称。
  • instanceName:性能计数器类别实例的名称,或者为空字符串 ("")(如果该类别包含单个实例)。 如果 categoryNameProcess,而要收集的性能计数器来自应用运行所在的当前 JVM 进程,请指定 "__SELF__"

Unix 性能计数器

使用 Application Insights 插件安装 collectd,获取各种不同的系统和网络数据。

获取用户和会话数据

现在你正在从 Web 服务发送遥测数据。 若要获取应用程序的 360 度全方位视图,可以添加更多监视:

发送自己的遥测数据

安装 SDK 后,你可以使用 API 发送自己的遥测数据:

可用性 Web 测试

Application Insights 可以定期测试网站,检查网站是否正常运行且做出响应。

详细了解如何设置可用性 Web 测试

故障排除

请参阅专用疑难解答文章

测试应用程序主机与引入服务之间的连接性

Application Insights SDK 和代理发送遥测,将其作为 REST 调用引入到引入终结点。 可以使用原始 REST 客户端通过 PowerShell 或使用 curl 命令,测试从 Web 服务器或应用程序主机计算机到引入服务终结点的连接。 请参阅排查 Azure Monitor Application Insights 中缺失应用程序遥测的问题

在 Application Insights 中浏览 Java 跟踪日志

如果使用 Logback 或 Log4J(v1.2 或 v2.0)进行跟踪,可将跟踪日志自动发送到 Application Insights,以便在其中发现和搜索日志。

提示

只需为应用程序设置一次 Application Insights 检测密钥。 如果使用的是 Java Spring 之类的框架,则可能已经在应用配置中的其他位置注册了密钥。

使用 Application Insights Java 代理

默认情况下,Application Insights Java 代理会自动捕获在 WARN 级别和更高级别上执行的日志记录。

可以更改使用 AI-Agent.xml 文件捕获的日志记录的阈值:

<?xml version="1.0" encoding="utf-8"?>
<ApplicationInsightsAgent>
   <Instrumentation>
      <BuiltIn>
         <Logging threshold="info"/>
      </BuiltIn>
   </Instrumentation>
</ApplicationInsightsAgent>

可以使用 AI-Agent.xml 文件禁用 Java 代理的日志记录捕获:

<?xml version="1.0" encoding="utf-8"?>
<ApplicationInsightsAgent>
   <Instrumentation>
      <BuiltIn>
         <Logging enabled="false"/>
      </BuiltIn>
   </Instrumentation>
</ApplicationInsightsAgent>

备选方法

如果不使用 Java 代理,可以按照以下说明进行操作。

安装 Java SDK

按照说明安装适用于 Java 的 Application Insights SDK(如果尚未安装)。

将日志记录库添加到项目

为项目选择适当的方式。

Maven

如果项目已设置为使用 Maven 进行生成,请将以下代码片段之一合并到 pom.xml 文件。 然后刷新项目依赖项,以下载库。

Logback


    <dependencies>
       <dependency>
          <groupId>com.microsoft.azure</groupId>
          <artifactId>applicationinsights-logging-logback</artifactId>
          <version>[2.0,)</version>
       </dependency>
    </dependencies>

Log4J v2.0


    <dependencies>
       <dependency>
          <groupId>com.microsoft.azure</groupId>
          <artifactId>applicationinsights-logging-log4j2</artifactId>
          <version>[2.0,)</version>
       </dependency>
    </dependencies>

Log4J v1.2


    <dependencies>
       <dependency>
          <groupId>com.microsoft.azure</groupId>
          <artifactId>applicationinsights-logging-log4j1_2</artifactId>
          <version>[2.0,)</version>
       </dependency>
    </dependencies>
Gradle

如果项目已设置为使用 Gradle 进行生成,请将以下代码行之一添加到 build.gradle 文件中的 dependencies 组。 然后刷新项目依赖项,以下载库。

Logback


    compile group: 'com.microsoft.azure', name: 'applicationinsights-logging-logback', version: '2.0.+'

Log4J v2.0

    compile group: 'com.microsoft.azure', name: 'applicationinsights-logging-log4j2', version: '2.0.+'

Log4J v1.2

    compile group: 'com.microsoft.azure', name: 'applicationinsights-logging-log4j1_2', version: '2.0.+'

按照指导手动安装 Application Insights Java SDK 并下载 jar。 在“Maven Central”页上,选择相应追加器的下载部分中的 jar 链接。 将下载的追加器 jar 添加到项目中。

记录器 下载
Logback Logback 追加器 Jar applicationinsights-logging-logback
Log4J v2.0 Log4J v2 追加器 Jar applicationinsights-logging-log4j2
Log4j v1.2 Log4J v1.2 追加器 Jar applicationinsights-logging-log4j1_2

将追加器添加到日志记录框架

若要开始跟踪,请将相关的代码片段合并到 Logback 或 Log4J 配置文件。

Logback


    <appender name="aiAppender" 
      class="com.microsoft.applicationinsights.logback.ApplicationInsightsAppender">
        <instrumentationKey>[APPLICATION_INSIGHTS_KEY]</instrumentationKey>
    </appender>
    <root level="trace">
      <appender-ref ref="aiAppender" />
    </root>

Log4J v2.0


    <Configuration packages="com.microsoft.applicationinsights.log4j.v2">
      <Appenders>
        <ApplicationInsightsAppender name="aiAppender" instrumentationKey="[APPLICATION_INSIGHTS_KEY]" />
      </Appenders>
      <Loggers>
        <Root level="trace">
          <AppenderRef ref="aiAppender"/>
        </Root>
      </Loggers>
    </Configuration>

Log4J v1.2


    <appender name="aiAppender" 
         class="com.microsoft.applicationinsights.log4j.v1_2.ApplicationInsightsAppender">
        <param name="instrumentationKey" value="[APPLICATION_INSIGHTS_KEY]" />
    </appender>
    <root>
      <priority value ="trace" />
      <appender-ref ref="aiAppender" />
    </root>

Application Insights 追加器可由配置的任何记录器(而不一定是根记录器)引用,如上面的代码示例所示。

在 Application Insights 门户中浏览跟踪

将项目配置为向 Application Insights 发送跟踪后,可以在 Application Insights 门户的搜索窗格中查看和搜索这些跟踪。

通过记录器提交的异常将作为“异常”遥测显示在门户中。

显示 Azure 门户中 Application Insights 资源的“搜索”窗格的屏幕截图。

监视 Java Web 应用中的依赖项、捕获的异常和方法执行时间

如果已使用 Application Insights SDK 检测了 Java Web 应用,则无需更改任何代码,就能使用 Java 代理来获取更深入的见解:

  • 依赖项:有关应用程序对其他组件的调用的数据,包括:

    • 传出 HTTP 调用:捕获通过 Apache HttpClientOkHttpjava.net.HttpURLConnection 发出的调用。
    • Redis 调用:捕获通过 Jedis 客户端发出的调用。
    • JDBC 查询:对于 MySQL 和 PostgreSQL,如果调用花费的时间长于 10 秒,代理将报告查询计划。
  • 应用程序日志记录:捕获应用程序日志并将其与 HTTP 请求和其他遥测数据相关联:

    • Log4j 1.2
    • Log4j2
    • Logback
  • 更好的操作命名:用于在门户中对请求进行聚合。

    • Spring:基于 @RequestMapping
    • JAX-RS:基于 @Path

若要使用 Java 代理,请在服务器上安装该代理。 必须使用 Application Insights Java SDK 检测 Web 应用。

安装适用于 Java 的 Application Insights 代理

  1. 在运行 Java 服务器的计算机上下载 2.x 代理。 确保所使用的 2.x Java 代理版本与所使用的 2.x Application Insights Java SDK 版本相匹配。

  2. 编辑应用程序服务器启动脚本,并添加以下 JVM 参数:

    -javaagent:<full path to the agent JAR file>

    例如,在 Linux 计算机上的 Tomcat 中:

    export JAVA_OPTS="$JAVA_OPTS -javaagent:<full path to agent JAR file>"

  3. 重新启动应用程序服务器。

配置代理

创建名为 AI-Agent.xml 的文件,并将它放在代理 jar 文件所在的同一个文件夹中。

设置 XML 文件的内容。 编辑以下示例,根据需要包含或省略功能。

<?xml version="1.0" encoding="utf-8"?>
<ApplicationInsightsAgent>
   <Instrumentation>
      <BuiltIn enabled="true">

         <!-- capture logging via Log4j 1.2, Log4j2, and Logback, default is true -->
         <Logging enabled="true" />

         <!-- capture outgoing HTTP calls performed through Apache HttpClient, OkHttp,
              and java.net.HttpURLConnection, default is true -->
         <HTTP enabled="true" />

         <!-- capture JDBC queries, default is true -->
         <JDBC enabled="true" />

         <!-- capture Redis calls, default is true -->
         <Jedis enabled="true" />

         <!-- capture query plans for JDBC queries that exceed this value (MySQL, PostgreSQL),
              default is 10000 milliseconds -->
         <MaxStatementQueryLimitInMS>1000</MaxStatementQueryLimitInMS>

      </BuiltIn>
   </Instrumentation>
</ApplicationInsightsAgent>

其他配置 (Spring Boot)

java -javaagent:/path/to/agent.jar -jar path/to/TestApp.jar

对于 Azure 应用服务,请执行以下步骤:

  1. 选择“设置”>“应用程序设置”。

  2. 在“应用设置”下添加新的键/值对:

    • 键:JAVA_OPTS
    • -javaagent:D:/home/site/wwwroot/applicationinsights-agent-2.6.4.jar

    代理必须打包为项目中的资源,以便它最终位于 D:/home/site/wwwroot/ 目录中。 若要确认你的代理是否位于正确的应用服务目录中,请转到“开发工具”>“高级工具”>“调试控制台”并查看站点目录的内容。

  3. 保存设置并重启应用。 这些步骤仅适用于 Windows 上运行的应用程序服务。

注意

AI-Agent.xml 和代理 jar 文件应位于同一文件夹中。 它们通常一起放在该项目的 /resources 文件夹中。

启用 W3C 分布式跟踪

将以下代码片段添加到 AI-Agent.xml:

<Instrumentation>
   <BuiltIn enabled="true">
      <HTTP enabled="true" W3C="true" enableW3CBackCompat="true"/>
   </BuiltIn>
</Instrumentation>

注意

默认已启用后向兼容性模式。 enableW3CBackCompat 参数是可选的,仅在要将其关闭时使用。

理想情况下,所有服务都已更新为支持 W3C 协议的较新版 SDK 时,就会出现这种情况。 建议尽快迁移到提供 W3C 支持的新版 SDK。

确保传入和传出(代理)配置完全相同。

查看数据

在 Application Insights 资源中,聚合的远程依赖项和方法执行时间显示在“性能”磁贴下

若要搜索依赖项、异常和方法报告的单个实例,请打开搜索

详细了解如何诊断依赖项问题

还有疑问?

使用以下资源:

在 Java Web 应用中筛选遥测

可通过筛选器选择 Java Web 应用发送到 Application Insights 的遥测。 有一些现成的筛选器可供使用。 你也可以编写自己的自定义筛选器。

现成的筛选器包括:

  • 跟踪严重性级别。
  • 特定的 URL、关键字或响应代码。
  • 快速响应。 换句话说,快速响应对应用的请求。
  • 特定事件名称。

注意

筛选器会使应用的指标产生偏差。 例如,为了诊断缓慢响应,你可能会决定设置一个排除快速响应时间的筛选器。 但必须注意,Application Insights 报告的平均响应时间会慢于实际速度。 此外,请求计数小于实际计数。

如果这是一个问题,请改用采样

设置筛选器

在 ApplicationInsights.xml 中添加 TelemetryProcessors 部分,如以下示例所示:


    <ApplicationInsights>
      <TelemetryProcessors>

        <BuiltInProcessors>
           <Processor type="TraceTelemetryFilter">
                  <Add name="FromSeverityLevel" value="ERROR"/>
           </Processor>

           <Processor type="RequestTelemetryFilter">
                  <Add name="MinimumDurationInMS" value="100"/>
                  <Add name="NotNeededResponseCodes" value="200-400"/>
           </Processor>

           <Processor type="PageViewTelemetryFilter">
                  <Add name="DurationThresholdInMS" value="100"/>
                  <Add name="NotNeededNames" value="home,index"/>
                  <Add name="NotNeededUrls" value=".jpg,.css"/>
           </Processor>

           <Processor type="TelemetryEventFilter">
                  <!-- Names of events we don't want to see -->
                  <Add name="NotNeededNames" value="Start,Stop,Pause"/>
           </Processor>

           <!-- Exclude telemetry from availability tests and bots -->
           <Processor type="SyntheticSourceFilter">
                <!-- Optional: specify which synthetic sources,
                     comma-separated
                     - default is all synthetics -->
                <Add name="NotNeededSources" value="Application Insights Availability Monitoring,BingPreview"
           </Processor>

        </BuiltInProcessors>

        <CustomProcessors>
          <Processor type="com.fabrikam.MyFilter">
            <Add name="Successful" value="false"/>
          </Processor>
        </CustomProcessors>

      </TelemetryProcessors>
    </ApplicationInsights>

检查整套内置处理器

内置筛选器

本部分介绍可用的内置筛选器。

指标遥测筛选器


           <Processor type="MetricTelemetryFilter">
                  <Add name="NotNeeded" value="metric1,metric2"/>
           </Processor>
  • NotNeeded:用逗号分隔的自定义指标名称列表

页面视图遥测筛选器


           <Processor type="PageViewTelemetryFilter">
                  <Add name="DurationThresholdInMS" value="500"/>
                  <Add name="NotNeededNames" value="page1,page2"/>
                  <Add name="NotNeededUrls" value="url1,url2"/>
           </Processor>
  • DurationThresholdInMS:持续时间,表示加载该页所花的时间。 如果设置了此参数,那么页面加载时间快于此时间时就不会报告。
  • NotNeededNames:用逗号分隔的页名称列表。
  • NotNeededUrls:用逗号分隔的 URL 分段列表。 例如,"home" 可筛选出 URL 中包含“home”的所有页面。

请求遥测筛选器


           <Processor type="RequestTelemetryFilter">
                  <Add name="MinimumDurationInMS" value="500"/>
                  <Add name="NotNeededResponseCodes" value="page1,page2"/>
                  <Add name="NotNeededUrls" value="url1,url2"/>
           </Processor>

综合源筛选器

筛选出 SyntheticSource 属性中具有值的所有遥测。 包括来自动程序、蜘蛛程序和可用性测试的请求。

筛选出针对所有综合请求的遥测:


           <Processor type="SyntheticSourceFilter" />

筛选出针对特定综合源的遥测:


           <Processor type="SyntheticSourceFilter" >
                  <Add name="NotNeeded" value="source1,source2"/>
           </Processor>
  • NotNeeded:用逗号分隔的综合源名称列表

遥测事件筛选器

筛选使用 TrackEvent() 记录的自定义事件:


           <Processor type="TelemetryEventFilter" >
                  <Add name="NotNeededNames" value="event1, event2"/>
           </Processor>
  • NotNeededNames:用逗号分隔的事件名称列表

跟踪遥测筛选器

筛选使用 TrackTrace()记录框架收集器记录的日志跟踪:


           <Processor type="TraceTelemetryFilter">
                  <Add name="FromSeverityLevel" value="ERROR"/>
           </Processor>
  • FromSeverityLevel 有效值为:

    • OFF:筛选出所有跟踪。
    • TRACE:不筛选。 等效于 TRACE 级别。
    • INFO:筛选出 TRACE 级别。
    • WARN:筛选出 TRACE 和 INFO。
    • ERROR:筛选出 WARN、INFO 和 TRACE。
    • CRITICAL:筛选出除 CRITICAL 外的所有值。

自定义筛选器

以下部分介绍创建你自己的自定义筛选器的步骤。

编写筛选器代码

在代码中创建实现 TelemetryProcessor 的类:


    package com.fabrikam.MyFilter;
    import com.microsoft.applicationinsights.extensibility.TelemetryProcessor;
    import com.microsoft.applicationinsights.telemetry.Telemetry;

    public class SuccessFilter implements TelemetryProcessor {

        /* Any parameters that are required to support the filter.*/
        private final String successful;

        /* Initializers for the parameters, named "setParameterName" */
        public void setNotNeeded(String successful)
        {
            this.successful = successful;
        }

        /* This method is called for each item of telemetry to be sent.
           Return false to discard it.
           Return true to allow other processors to inspect it. */
        @Override
        public boolean process(Telemetry telemetry) {
            if (telemetry == null) { return true; }
            if (telemetry instanceof RequestTelemetry)
            {
                RequestTelemetry requestTelemetry = (RequestTelemetry)    telemetry;
                return request.getSuccess() == successful;
            }
            return true;
        }
    }

在配置文件中调用筛选器

现在,在 ApplicationInsights.xml 中:



    <ApplicationInsights>
      <TelemetryProcessors>
        <CustomProcessors>
          <Processor type="com.fabrikam.SuccessFilter">
            <Add name="Successful" value="false"/>
          </Processor>
        </CustomProcessors>
      </TelemetryProcessors>
    </ApplicationInsights>

调用筛选器 (Java Spring)

对于基于 Spring 框架的应用程序,自定义遥测处理器必须在主应用程序类中注册为 bean。 然后,它们将在应用程序启动时自动连接。

@Bean
public TelemetryProcessor successFilter() {
      return new SuccessFilter();
}

application.properties 中创建你自己的筛选器参数。 然后使用 Spring Boot 的外部化配置框架将这些参数传递到自定义筛选器。

故障排除

本部分提供故障排除提示。

我的筛选器不能正常工作

检查提供的参数值是否有效。 例如,持续时间应为整数。 无效值将导致筛选器被忽略。 如果自定义筛选器从构造函数或 set 方法中引发异常,它会被忽略。

collectd:Application Insights 中的 Linux 性能指标(已弃用)

若要浏览 Application Insights 中 Linux 系统性能指标,请安装 collectd 及其 Application Insights 插件。 此开放源解决方案收集了各种系统和网络统计信息。

如果已通过 Application Insights 检测 Java Web 服务,则通常会使用 collectd。 它可提供更多数据,有助于增强应用性能或诊断问题。

获取检测密钥

Azure 门户中,打开要显示数据的 Application Insights 资源。 或者,你可以创建新资源

复制可标识资源的检测密钥。

显示 Azure 门户中 Application Insights 资源的概述窗格的屏幕截图,其中突出显示了检测密钥。

安装 collectd 和插件

在 Linux 服务器计算机上:

  1. 安装 collectd 版本 5.4.0 或更高版本。
  2. 下载 Application Insights collectd 编写器插件。 注意版本号。
  3. 将插件 jar 复制到 /usr/share/collectd/java 中。
  4. 编辑 /etc/collectd/collectd.conf
    • 确保已启用 Java 插件

    • 更新 java.class.path 的 JVMArg,以包括以下 jar。 更新版本号,以匹配下载版本:

      • /usr/share/collectd/java/applicationinsights-collectd-1.0.5.jar
    • 使用资源中的检测密钥添加此代码片段:

      
           LoadPlugin "com.microsoft.applicationinsights.collectd.ApplicationInsightsWriter"
           <Plugin ApplicationInsightsWriter>
              InstrumentationKey "Your key"
           </Plugin>
      

      以下是示例配置文件的一部分:

      
          ...
          # collectd plugins
          LoadPlugin cpu
          LoadPlugin disk
          LoadPlugin load
          ...
      
          # Enable Java Plugin
          LoadPlugin "java"
      
          # Configure Java Plugin
          <Plugin "java">
            JVMArg "-verbose:jni"
            JVMArg "-Djava.class.path=/usr/share/collectd/java/applicationinsights-collectd-1.0.5.jar:/usr/share/collectd/java/collectd-api.jar"
      
            # Enabling Application Insights plugin
            LoadPlugin "com.microsoft.applicationinsights.collectd.ApplicationInsightsWriter"
      
            # Configuring Application Insights plugin
            <Plugin ApplicationInsightsWriter>
              InstrumentationKey "12345678-1234-1234-1234-123456781234"
            </Plugin>
      
            # Other plugin configurations ...
            ...
          </Plugin>
          ...
      

配置其他 collectd 插件,其可从不同源中收集各种数据。

根据 collectd手册将其重启。

查看 Application Insights 中的数据

在 Application Insights 资源中,打开指标并添加图表。 选择要从“自定义”类别查看的指标。

默认情况下,会从收集指标的所有主机中聚合指标。 若要查看每个主机的指标,在“图表详细信息”窗格中,打开“分组”,并选择按“CollectD-Host”分组。

排除特定统计信息的上传

默认情况下,Application Insights 插件会发送由启用的所有 collectd read 插件收集的所有数据。

若要排除特定插件或数据源中的数据,请执行以下操作:

  • 编辑配置文件。

  • <Plugin ApplicationInsightsWriter> 中,添加下表中所示的指令行:

    指令 效果
    Exclude disk 排除由 disk 插件收集的所有数据。
    Exclude disk:read,write 排除 disk 插件中名为 readwrite 的源。

使用新行分隔指令。

遇到问题?

本部分提供故障排除提示。

在门户中看不到数据

请尝试以下选项:

  • 打开搜索,查看原始事件是否已到达。 有时需较长时间才能在指标资源管理器中看到数据。
  • 可能需要为传出数据设置防火墙例外
  • 在 Application Insights 插件中启用跟踪。 在 <Plugin ApplicationInsightsWriter> 中添加此行:
    • SDKLogger true
  • 打开终端并在详细模式下启动 collectd,查看其报告的任何问题:
    • sudo collectd -f

已知问题

Application Insights 写入插件与某些读取插件不兼容。某些插件有时会发送 NaN,但 Application Insights 插件需要浮点数。

  • 症状:collectd 日志显示包括“AI: ... SyntaxError: 意外的令牌 N”的错误。
  • 解决方法:排除由问题写入插件收集的数据。

Micrometer 应用程序监视功能可以度量基于 JVM 的应用程序代码的指标,并可用于将数据导出到偏爱的监视系统。 本部分介绍如何对 Spring Boot 和非 Spring Boot 应用程序配合使用 Micrometer 与 Application Insights。

使用 Spring Boot 1.5x

将以下依赖项添加到 pom.xml 或 build.gradle 文件:

  • Application Insights spring-boot-starter 2.5.0 或更高版本。
  • Micrometer Azure Registry 1.1.0 或更高版本。
  • Micrometer Spring Legacy 1.1.0 或更高版本。 它向后移植 Spring 框架中的自动配置代码。
  • ApplicationInsights 资源

执行以下步骤:

  1. 更新 Spring Boot 应用程序的 pom.xml 文件,在其中添加以下依赖项:

    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>applicationinsights-spring-boot-starter</artifactId>
        <version>2.5.0</version>
    </dependency>
    
    <dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-spring-legacy</artifactId>
        <version>1.1.0</version>
    </dependency>
    
    <dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-registry-azure-monitor</artifactId>
        <version>1.1.0</version>
    </dependency>
    
    
  2. 使用以下属性更新 application.properties 或 YML 文件中的 Application Insights 检测密钥:

    azure.application-insights.instrumentation-key=<your-instrumentation-key-here>

  3. 生成并运行应用程序。

上述步骤应会使用自动收集到 Azure Monitor 的预先聚合指标启动并运行应用程序。

使用 Spring 2.x

将以下依赖项添加到 pom.xml 或 build.gradle 文件:

  • Application Insights Spring-boot-starter 2.1.2 或更高版本
  • Azure-spring-boot-metrics-starters 2.0.7 或更高版本
  • Application Insights 资源

执行以下步骤:

  1. 更新 Spring Boot 应用程序的 pom.xml 文件,在其中添加以下依赖项:

    <dependency> 
          <groupId>com.microsoft.azure</groupId>
          <artifactId>azure-spring-boot-metrics-starter</artifactId>
          <version>2.0.7</version>
    </dependency>
    
  2. 使用以下属性更新 application.properties 或 YML 文件中的 Application Insights 检测密钥:

    azure.application-insights.instrumentation-key=<your-instrumentation-key-here>

  3. 生成并运行应用程序。

上述步骤应会使用自动收集到 Azure Monitor 的预先聚合指标运行应用程序。 有关如何微调 Application Insights Spring Boot Starter 的详细信息,请参阅 GitHub 上的自述文件

默认指标:

  • 为 Tomcat、JVM 自动配置的指标、Logback 指标、Log4J 指标、运行时间指标、处理器指标和 FileDescriptorMetrics。
  • 例如,如果类路径上存在 Netflix Hystrix,则我们也会获取这些指标。
  • 可通过添加相应的 bean 来获取以下指标:
    • CacheMetricsCaffeineCacheEhCache2GuavaCacheHazelcastCacheJCache
    • DataBaseTableMetrics
    • HibernateMetrics
    • JettyMetrics
    • OkHttp3 指标
    • Kafka 指标

禁用自动指标收集:

  • JVM 指标:
    • management.metrics.binders.jvm.enabled=false
  • Logback 指标:
    • management.metrics.binders.logback.enabled=false
  • 运行时间指标:
    • management.metrics.binders.uptime.enabled=false
  • 处理器指标:
    • management.metrics.binders.processor.enabled=false
  • FileDescriptorMetrics:
    • management.metrics.binders.files.enabled=false
  • Hystrix 指标(如果 classpath 中包含库):
    • management.metrics.binders.hystrix.enabled=false
  • AspectJ 指标(如果 classpath 中包含库):
    • spring.aop.enabled=false

注意

在 Spring Boot 应用程序的 application.properties 或 application.yml 文件中指定上述属性。

对非 Spring Boot Web 应用程序使用 Micrometer

将以下依赖项添加到 pom.xml 或 build.gradle 文件:

执行以下步骤:

  1. 将以下依赖项添加到 pom.xml 或 build.gradle 文件中:

        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-azure-monitor</artifactId>
            <version>1.1.0</version>
        </dependency>
    
        <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>applicationinsights-web-auto</artifactId>
            <version>2.5.0</version>
        </dependency>
    
  2. 在 resources 文件夹中添加 ApplicationInsights.xml 文件(如果尚未添加)。 有关详细信息,请参阅添加 ApplicationInsights.xml 文件

  3. 示例 Servlet 类(发出计时器指标):

        @WebServlet("/hello")
        public class TimedDemo extends HttpServlet {
    
          private static final long serialVersionUID = -4751096228274971485L;
    
          @Override
          @Timed(value = "hello.world")
          protected void doGet(HttpServletRequest request, HttpServletResponse response)
              throws ServletException, IOException {
    
            response.getWriter().println("Hello World!");
            MeterRegistry registry = (MeterRegistry) getServletContext().getAttribute("AzureMonitorMeterRegistry");
    
        //create new Timer metric
            Timer sampleTimer = registry.timer("timer");
            Stream<Integer> infiniteStream = Stream.iterate(0, i -> i+1);
            infiniteStream.limit(10).forEach(integer -> {
              try {
                Thread.sleep(1000);
                sampleTimer.record(integer, TimeUnit.MILLISECONDS);
              } catch (Exception e) {}
               });
          }
          @Override
          public void init() throws ServletException {
            System.out.println("Servlet " + this.getServletName() + " has started");
          }
          @Override
          public void destroy() {
            System.out.println("Servlet " + this.getServletName() + " has stopped");
          }
    
        }
    
    
  4. 示例配置类:

         @WebListener
         public class MeterRegistryConfiguration implements ServletContextListener {
    
           @Override
           public void contextInitialized(ServletContextEvent servletContextEvent) {
    
         // Create AzureMonitorMeterRegistry
           private final AzureMonitorConfig config = new AzureMonitorConfig() {
             @Override
             public String get(String key) {
                 return null;
             }
            @Override
               public Duration step() {
                 return Duration.ofSeconds(60);}
    
             @Override
             public boolean enabled() {
                 return false;
             }
         };
    
      MeterRegistry azureMeterRegistry = AzureMonitorMeterRegistry.builder(config);
    
             //set the config to be used elsewhere
             servletContextEvent.getServletContext().setAttribute("AzureMonitorMeterRegistry", azureMeterRegistry);
    
           }
    
           @Override
           public void contextDestroyed(ServletContextEvent servletContextEvent) {
    
           }
         }
    

若要详细了解指标,请参阅 Micrometer 文档

有关演示如何创建不同类型的指标的其他示例代码,请参阅官方的 Micrometer GitHub 存储库

绑定其他指标集合

以下部分介绍如何收集更多指标。

SpringBoot/Spring

创建相应指标类别的 bean。 例如,假设你需要 Guava 缓存指标:

    @Bean
    GuavaCacheMetrics guavaCacheMetrics() {
        Return new GuavaCacheMetrics();
    }

有多个指标默认未启用,但可按上述方式绑定。 有关完整列表,请参阅 Micrometer GitHub 存储库

非 Spring 应用

将以下绑定代码添加到配置文件:

    New GuavaCacheMetrics().bind(registry);

后续步骤