我们有一个使用 HikariCP 的自定义 Web 应用程序。该应用程序被编译成
jar
,然后在 docker 容器中启动。根据环境,当我们启动 newrelic-agent.jar
时,我们通过 -javaagent
标志加载 webapp.jar
。
我们的 HikariCP 设置如下所示:
private DataSource createDataSource() {
final HikariConfig config = new HikariConfig();
config.setJdbcUrl(...);
config.setUsername(...);
config.setPassword(...);
config.setSchema(...);
config.setConnectionTimeout(...);
config.setMinimumIdle(...);
config.setMaximumPoolSize(...);
config.setIdleTimeout(...);
config.setLeakDetectionThreshold(...);
config.setMaxLifetime(...);
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
config.setMetricRegistry(metricsRegistry.getRegistry());
return new HikariDataSource(config);
}
我们创建了一个服务,根据 NewRelic 类是否存在,在应用程序启动时启动报告器。由于我们正在加载
java agent
,它还为我们提供了解析后的 newrelic.yaml
配置,我们将在下面重复使用它:
public class NewRelicMetricsService {
private static final Logger logger = LoggerFactory.getLogger(NewRelicMetricsService.class);
private final NewRelicReporter reporter;
@Inject
public NewRelicMetricsService(ApplicationMetricsRegistry metricRegistry) {
NewRelicReporter tmpReporter = null;
// Check if the NewRelic java agent has been loaded.
try {
Class.forName("com.newrelic.api.agent.NewRelic");
Config config = NewRelic.getAgent().getConfig();
SenderConfiguration sender = MetricBatchSender.configurationBuilder()
.apiKey(config.getValue("license_key"))
.useLicenseKey(true)
.httpPoster(new OkHttpPoster(Duration.ofSeconds(2)))
.build();
MetricBatchSender metricBatchSender = MetricBatchSender.create(sender);
// Use this to define custom attributes visible in the APM & Service.
Attributes commonAttributes = new Attributes();
tmpReporter = NewRelicReporter.build(metricRegistry.getRegistry(), metricBatchSender)
.commonAttributes(commonAttributes)
.build();
} catch (ClassNotFoundException e) {
logger.info("New Relic java agent has not been loaded. Metrics will not be showing in New Relic.");
}
this.reporter = tmpReporter;
// Start reporting.
start();
}
public void start() {
if (reporter == null) {
return;
}
reporter.start(1, TimeUnit.SECONDS);
}
public void stop() {
if (reporter == null) {
return;
}
reporter.stop();
}
}
上面的代码工作得很好,指标开始出现在 NewRelic 的
Metrics
下。
但是,一旦您尝试通过
entity
过滤指标 - 这些指标就无处可见。就好像指标的范围被限制在“根”实体中,您可以在其中看到“所有指标”。
不完全确定这里出了什么问题。有人有什么想法吗? 也许我们需要添加一个特定/附加的
attributes
?
问题是遥测 SDK 不知道您正在检测的应用程序(实体)。
如果您将
entity.guid
设置为 Telemetry SDK 配置中的通用属性,它会将指标链接到应用程序。
String entityGuid = NewRelic.getAgent().getLinkingMetadata().get("entity.guid");
Attributes commonAttributes = new Attributes()
.put("entity.guid", entityGuid);
或者,您可以使用代理 API(请参阅“创建和累积自定义指标”)。