使用 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.
问题:
- 下一步是什么?
- 我是否需要 New Relic 的本地 运行ning 服务器,就像我为 Prometheus 所做的那样?
- 我在哪里可以看到这些数据?我在 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'
- 这个查询的结果说明了什么?它是与我的应用程序相关的指标吗?
这是我在这里分享的演示的 GitHub link。
我没有找到关于此的任何明确说明,那里有一些示例,但使用 Java 代理。
我们将不胜感激任何形式的帮助。
下一步是什么?
看来您已完成并成功将指标发送到 NewRelic。
我是否需要 New Relic 的本地 运行 服务器,就像我为 Prometheus 所做的那样?
不,NewRelic 是 SaaS 产品。
我在哪里可以看到这些数据?我在 New Relic 中有一个帐户,但我在那里什么都看不到
看来你已经找到了(截图)。
这个查询的结果说明了什么?它是与我的应用程序相关的指标吗?
从屏幕截图中,我无法判断它是否是您的应用程序,但这似乎是由 Spring 启动应用程序推送的 jvm.memory.committed
指标(很有可能)。
为了查看这是否是您的应用程序,您可以添加公共标签,这些标签可以告诉您应用程序的名称和某种实例 ID(或主机名?),以防您有来自相同的应用程序,请参阅:
- Spring Boot Docs(我会这样做)
- Micrometer Docs(如果您不使用 Spring 引导或想做一些棘手的事情,请执行此操作)
- Real-World Example
据我目前所学。
有 3 种方法可以将 New Relic 与 Spring 引导应用程序集成-
- 使用 New Relic 提供的 Java 代理
- 使用 New Relic 的 Micrometer 依赖项
- Micrometer 的新 Relic 依赖项
1。使用 New Relic
提供的 Java 代理进行配置
- 从此 URL- https://docs.newrelic.com/docs/release-notes/agent-release-notes/java-release-notes/
下载 Java 代理
- 提取它。
- 修改解压文件夹中的newrelic.yml文件以包含您的
license_key:
app_name:
- 使用一些 REST 端点创建Spring启动应用程序。
- 构建应用程序。
- 导航到您提取 newrelic java 代理的根路径。
- 输入这条命令
java -javagent:<path to your new relic jar>\newrelic.jar -jar <path to your application jar>\<you rapplication jar name>.jar
查看应用指标-
- 登录到您的 New Relic 帐户。
- 转到资源管理器选项卡。
- 点击服务-APM
- 您可以在此处看到您的应用程序名称(您在 newrelic.yml 文件中提到的)。
- 单击应用程序名称。
- 仪表板应如下所示。
Using New Relic's Micrometer Dependency is the preferred way to do it.
2。使用 New Relic 的 Micrometer Dependency 的配置
- 添加此依赖项
<dependency>
<groupId>com.newrelic.telemetry</groupId>
<artifactId>micrometer-registry-new-relic</artifactId>
<version>0.7.0</version>
</dependency>
- 修改
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;
}
}
- 运行 应用程序。
查看应用指标-
- 登录到您的 New Relic 帐户。
- 转到资源管理器选项卡。
- 单击服务-OpenTelemetry
- 您可以在此处看到您的应用程序名称(您在 MicrometerConfig 文件中提到过)。
- 单击应用程序名称。
- 仪表板应如下所示。
我正在尝试使用 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.
问题:
- 下一步是什么?
- 我是否需要 New Relic 的本地 运行ning 服务器,就像我为 Prometheus 所做的那样?
- 我在哪里可以看到这些数据?我在 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'
- 这个查询的结果说明了什么?它是与我的应用程序相关的指标吗?
这是我在这里分享的演示的 GitHub link。 我没有找到关于此的任何明确说明,那里有一些示例,但使用 Java 代理。
我们将不胜感激任何形式的帮助。
下一步是什么?
看来您已完成并成功将指标发送到 NewRelic。我是否需要 New Relic 的本地 运行 服务器,就像我为 Prometheus 所做的那样?
不,NewRelic 是 SaaS 产品。我在哪里可以看到这些数据?我在 New Relic 中有一个帐户,但我在那里什么都看不到
看来你已经找到了(截图)。这个查询的结果说明了什么?它是与我的应用程序相关的指标吗?
从屏幕截图中,我无法判断它是否是您的应用程序,但这似乎是由 Spring 启动应用程序推送的jvm.memory.committed
指标(很有可能)。
为了查看这是否是您的应用程序,您可以添加公共标签,这些标签可以告诉您应用程序的名称和某种实例 ID(或主机名?),以防您有来自相同的应用程序,请参阅:
- Spring Boot Docs(我会这样做)
- Micrometer Docs(如果您不使用 Spring 引导或想做一些棘手的事情,请执行此操作)
- Real-World Example
据我目前所学。 有 3 种方法可以将 New Relic 与 Spring 引导应用程序集成-
- 使用 New Relic 提供的 Java 代理
- 使用 New Relic 的 Micrometer 依赖项
- Micrometer 的新 Relic 依赖项
1。使用 New Relic
提供的 Java 代理进行配置- 从此 URL- https://docs.newrelic.com/docs/release-notes/agent-release-notes/java-release-notes/ 下载 Java 代理
- 提取它。
- 修改解压文件夹中的newrelic.yml文件以包含您的 license_key: app_name:
- 使用一些 REST 端点创建Spring启动应用程序。
- 构建应用程序。
- 导航到您提取 newrelic java 代理的根路径。
- 输入这条命令
java -javagent:<path to your new relic jar>\newrelic.jar -jar <path to your application jar>\<you rapplication jar name>.jar
查看应用指标-
- 登录到您的 New Relic 帐户。
- 转到资源管理器选项卡。
- 点击服务-APM
- 您可以在此处看到您的应用程序名称(您在 newrelic.yml 文件中提到的)。
- 单击应用程序名称。
- 仪表板应如下所示。
Using New Relic's Micrometer Dependency is the preferred way to do it.
2。使用 New Relic 的 Micrometer Dependency 的配置
- 添加此依赖项
<dependency>
<groupId>com.newrelic.telemetry</groupId>
<artifactId>micrometer-registry-new-relic</artifactId>
<version>0.7.0</version>
</dependency>
- 修改
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;
}
}
- 运行 应用程序。
查看应用指标-
- 登录到您的 New Relic 帐户。
- 转到资源管理器选项卡。
- 单击服务-OpenTelemetry
- 您可以在此处看到您的应用程序名称(您在 MicrometerConfig 文件中提到过)。
- 单击应用程序名称。
- 仪表板应如下所示。