使用 Micrometer 将 New Relic 与 Spring Boot 集成

Integrate New Relic with Spring Boot using Micrometer

我正在尝试使用 Micrometer 将一个简单的 Spring 引导应用程序与 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 与此应用程序集成。我在本地系统的 Docker 容器中将 Prometheus 设置为 运行。我使用了以下一组命令-

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 依赖项。我也共享了 application.properties 文件。我可以在我的控制台中看到日志,说它正在将数据发送到 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 的本地 运行ning 服务器,就像我为 Prometheus 所做的那样?
  3. 我在哪里可以看到这些数据?我在 New Relic 中有一个帐户,但我在那里什么都看不到

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

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

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

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

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

  1. 下一步是什么?
    看来您已完成并成功将指标发送到 NewRelic。

  2. 我是否需要 New Relic 的本地 运行 服务器,就像我为 Prometheus 所做的那样?
    不,NewRelic 是 SaaS 产品。

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

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

为了查看这是否是您的应用程序,您可以添加公共标签,这些标签可以告诉您应用程序的名称和某种实例 ID(或主机名?),以防您有来自相同的应用程序,请参阅:

据我目前所学。 有 3 种方法可以将 New Relic 与 Spring 引导应用程序集成-

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

1。使用 New Relic

提供的 Java 代理进行配置
  1. 从此 URL- https://docs.newrelic.com/docs/release-notes/agent-release-notes/java-release-notes/
  2. 下载 Java 代理
  3. 提取它。
  4. 修改解压文件夹中的newrelic.yml文件以包含您的 license_key: app_name:
  5. 使用一些 REST 端点创建Spring启动应用程序。
  6. 构建应用程序。
  7. 导航到您提取 newrelic java 代理的根路径。
  8. 输入这条命令 java -javagent:<path to your new relic jar>\newrelic.jar -jar <path to your application jar>\<you rapplication jar name>.jar

查看应用指标-

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

Using New Relic's Micrometer Dependency is the preferred way to do it.

2。使用 New Relic 的 Micrometer Dependency 的配置

  1. 添加此依赖项
<dependency>
        <groupId>com.newrelic.telemetry</groupId>
        <artifactId>micrometer-registry-new-relic</artifactId>
        <version>0.7.0</version>
    </dependency>
  1. 修改 MicrometerConfig.java class 以添加您的 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. 仪表板应如下所示。