【问题标题】:Integrate New Relic with Spring Boot using Micrometer使用 Micrometer 将 New Relic 与 Spring Boot 集成
【发布时间】:2021-10-24 07:45:03
【问题描述】:

我正在尝试使用 Micrometer 将一个简单的 Spring Boot 应用程序与 New Relic 集成。

以下是配置详情:-

application.properties

management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always

management.metrics.export.newrelic.enabled=true
management.metrics.export.newrelic.api-key:MY_API_KEY // Have added the API key here
management.metrics.export.newrelic.account-id: MY_ACCOUNT_ID // Have added the account id here
logging.level.io.micrometer.newrelic=TRACE

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.5</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>springboot.micrometer.demo</groupId>
    <artifactId>micrometer-new-relic</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>micrometer-new-relic</name>
    <description>Demo project for actuator integration with new relic using micrometer</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-new-relic</artifactId>
        </dependency>
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

我能够使用 micrometer-registry-prometheus 依赖项将 Prometheus 与此应用程序集成。我已将 Prometheus 设置为在本地系统的 Docker 容器中运行。我使用了以下一组命令-

docker pull prom/prometheus
docker run -p 9090:9090 -v D:/Workspaces/STS/server_sent_events_blog/micrometer-new-relic/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

prometheus.yml

global:
  scrape_interval: 4s
  evaluation_interval: 4s

scrape_configs:
  - job_name: 'spring_micrometer'
    metrics_path: '/actuator/prometheus'
    scrape_interval: 5s
    static_configs:
      - targets: ['my_ip_address:8080']

当我导航到localhost:9090/targets 时,我可以看到 Prometheus 仪表板显示了我的应用程序详细信息,并且它可以从中抓取数据。在仪表板中,我可以看到我的自定义指标以及其他指标。

所以我的问题是我想用 New Relic 实现同样的目标。我添加了micrometer-registry-new-relic pom 依赖项。我也分享了@98​​7654334@ 文件。我可以在控制台中看到日志说它正在向 New Relic 发送数据-

2021-10-24 12:42:04.889 DEBUG 2672 --- [trics-publisher] i.m.n.NewRelicInsightsApiClientProvider : successfully sent 58 metrics to New Relic.

问题:

  1. 接下来的步骤是什么?
  2. 我是否需要一个本地运行的 New Relic 服务器,就像我为 Prometheus 所做的那样?
  3. 在哪里可以可视化这些数据?我在 New Relic 有一个帐户,但那里什么也看不到

https://discuss.newrelic.com/t/integrate-spring-boot-actuator-with-new-relic/126732 根据上面的链接,Spring Bootctuator 将度量作为事件类型“SpringBootSample”推送。 通过 NRQL 查询,我们可以确认这一点-

FROM SpringBootSample SELECT max(value) TIMESERIES 1 minute WHERE metricName = 'jvmMemoryCommitted'

  1. 这个查询的结果说明了什么?它是与我的应用相关的指标吗?

这是我在这里分享的演示的GitHub link。 我没有找到任何明确的说明,有一些例子,但使用 Java 代理。

我们将不胜感激任何形式的帮助。

【问题讨论】:

    标签: java spring-boot prometheus newrelic micrometer


    【解决方案1】:
    1. 接下来的步骤是什么?
      看来您已经完成并成功将指标发送到 NewRelic。

    2. 我是否需要像 Prometheus 一样在本地运行 New Relic 服务器?
      不,NewRelic 是一种 SaaS 产品。

    3. 我可以在哪里可视化这些数据?我在 New Relic 有一个帐户,我在那里什么都看不到
      看来你已经找到了(截图)。

    4. 这个查询的结果说明了什么?它是与我的应用程序相关的指标吗?
      从屏幕截图中,我无法判断它是否是您的应用程序,但这似乎是 Spring Boot 应用程序推送的 jvm.memory.committed 指标(很有可能)。

    为了查看这是否是您的应用程序,您可以添加通用标签,这些标签可以告诉应用程序的名称和某种实例 ID(或主机名?),以防您有来自同一个应用程序的多个实例,见:

    【讨论】:

    • New Relic 的Explorer 标签下看不到应用名称。当我使用 Java 代理进行配置时,我需要在 newrelic.yml 文件中添加我的许可证密钥和应用程序名称,相同的名称显示在 Explorer 选项卡下。然后我可以设置自定义警报,每当我的休息端点被击中时,指标就会反映在那里。当前使用千分尺的设置都不会发生这种情况。所以,我认为它还没有连接到我的 New Relic 帐户,或者需要进行更多配置。
    • 您是否将应用名称添加为标签,如上所示?
    • 是的,我已将应用名称添加为标签,如您所显示的 management.metrics.tags.application= Old Micrometer App,但它仍然不起作用。但是,我找到了使用new relics micrometer dependency 的解决方法,它使用`New Relic Java Telemetry SDK`。使用它我可以在Explorer>Services-Open Telemetry 下看到我的应用程序名称。但是使用Java Agent,应用程序登陆Explorer>APM。现在我面临的问题是,我能够看到Explorer>Data>Metrics 下的其余端点指标(Avergae、count、sum、max、min),但我在Explorer>Summary.
    【解决方案2】:

    根据我目前所学到的。 将 New Relic 与 Spring Boot 应用程序集成有 3 种方法-

    1. 使用 New Relic 提供的 Java 代理
    2. 使用 New Relic 的千分尺依赖性
    3. Micrometer 的新 Relic 依赖项

    1。使用 New Relic 提供的 Java 代理进行配置

    1. 从此 URL 下载 Java 代理 - https://docs.newrelic.com/docs/release-notes/agent-release-notes/java-release-notes/
    2. 解压。
    3. 修改解压文件夹中的 newrelic.yml 文件以包含您的 注册码: 应用名称:
    4. 创建一个带有一些 REST 端点的 SpringBoot 应用程序。
    5. 构建应用程序。
    6. 导航到您提取 newrelic java 代理的根路径。
    7. 输入此命令 java -javagent:&lt;path to your new relic jar&gt;\newrelic.jar -jar &lt;path to your application jar&gt;\&lt;you rapplication jar name&gt;.jar

    查看应用指标-

    1. 登录您的 New Relic 帐户。
    2. 转到“资源管理器”选项卡。
    3. 点击服务-APM
    4. 您可以在此处看到您的应用程序的名称(您在 newrelic.yml 文件中提到过)。
    5. 点击应用名称。
    6. 仪表板应如下所示。

    使用 New Relic 的 Micrometer Dependency 是首选方法。

    2。使用 New Relic 的千分尺依赖配置

    1. 添加此依赖项
    <dependency>
            <groupId>com.newrelic.telemetry</groupId>
            <artifactId>micrometer-registry-new-relic</artifactId>
            <version>0.7.0</version>
        </dependency>
    
    1. 修改 MicrometerConfig.java 类以添加您的 API 密钥和应用程序名称。
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    
    import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration;
    import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
    import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
    import org.springframework.boot.autoconfigure.AutoConfigureAfter;
    import org.springframework.boot.autoconfigure.AutoConfigureBefore;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import com.newrelic.telemetry.Attributes;
    import com.newrelic.telemetry.micrometer.NewRelicRegistry;
    import com.newrelic.telemetry.micrometer.NewRelicRegistryConfig;
    
    import java.time.Duration;
    import io.micrometer.core.instrument.config.MeterFilter;
    import io.micrometer.core.instrument.util.NamedThreadFactory;
    
    @Configuration
    @AutoConfigureBefore({ CompositeMeterRegistryAutoConfiguration.class, SimpleMetricsExportAutoConfiguration.class })
    @AutoConfigureAfter(MetricsAutoConfiguration.class)
    @ConditionalOnClass(NewRelicRegistry.class)
    public class MicrometerConfig {
    
        @Bean
        public NewRelicRegistryConfig newRelicConfig() {
            return new NewRelicRegistryConfig() {
                @Override
                public String get(String key) {
                    return null;
                }
    
                @Override
                public String apiKey() {
                    return "your_api_key"; // for production purposes take it from config file
                }
    
                @Override
                public Duration step() {
                    return Duration.ofSeconds(5);
                }
    
                @Override
                public String serviceName() {
                    return "your_service_name"; // take it from config file
                }
    
            };
        }
    
        @Bean
        public NewRelicRegistry newRelicMeterRegistry(NewRelicRegistryConfig config) throws UnknownHostException {
            NewRelicRegistry newRelicRegistry = NewRelicRegistry.builder(config)
                    .commonAttributes(new Attributes().put("host", InetAddress.getLocalHost().getHostName())).build();
            newRelicRegistry.config().meterFilter(MeterFilter.ignoreTags("plz_ignore_me"));
            newRelicRegistry.config().meterFilter(MeterFilter.denyNameStartsWith("jvm.threads"));
            newRelicRegistry.start(new NamedThreadFactory("newrelic.micrometer.registry"));
            return newRelicRegistry;
        }
    }
    
    1. 运行应用程序。

    查看应用程序指标-

    1. 登录您的 New Relic 帐户。
    2. 转到“资源管理器”选项卡。
    3. 点击服务-OpenTelemetry
    4. 您可以在此处看到您的应用程序的名称(您在 MicrometerConfig 文件中提到过)。
    5. 点击应用名称。
    6. 仪表板应如下所示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-16
      • 2013-03-07
      • 2013-07-03
      • 1970-01-01
      • 2018-11-06
      • 1970-01-01
      • 2020-12-20
      相关资源
      最近更新 更多