如何将 Micrometer 与 Azure Application Insights Java SDK 配合使用(不建议)

重要

不再建议使用本文档中所述的方法。

监视 Java 应用程序的建议方法是在不更改代码的情况下使用自动检测。 Micrometer 遥测是通过 Application Insights Java 3.0 代理自动收集的,请遵循 Application Insights Java 3.0 代理的准则。

备注

Application Insights Java SDK 不支持 Spring Webflux,请改用 Application Insights Java 3.0 代理

无需检测的 Application Insights Java 3.0 代理支持 Webflux 和 Micrometer。

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

使用 Spring Boot 1.5x

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

步骤

  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. 生成并运行应用程序

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

使用 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. 生成并运行应用程序

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

默认指标:

  • 为 Tomcat、JVM 自动配置的指标、Logback 指标、Log4J 指标、运行时间指标、处理器指标、FileDescriptorMetrics。
  • 例如,如果类路径上存在 Netflix Hystrix,则我们也会获取这些指标。
  • 可通过添加相应的 bean 来获取以下指标。
    • CacheMetrics (CaffeineCache, EhCache2, GuavaCache, HazelcastCache, JCache)
    • 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 指标(如果类路径中包含该库):
    • management.metrics.binders.hystrix.enabled=false
  • AspectJ 指标(如果类路径中包含该库):
    • 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. ApplicationInsights.xml 文件放入 resources 文件夹中:

    <?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>
    
  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);

后续步骤