如何让 HikariCP 指标在 NewRelic 中正确显示?

问题描述 投票:0回答:1

我们有一个使用 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
下。

hikaricp metrics in newrelic

但是,一旦您尝试通过

entity
过滤指标 - 这些指标就无处可见。就好像指标的范围被限制在“根”实体中,您可以在其中看到“所有指标”。

enter image description here

不完全确定这里出了什么问题。有人有什么想法吗? 也许我们需要添加一个特定/附加的

attributes

java jmx dropwizard newrelic
1个回答
0
投票

问题是遥测 SDK 不知道您正在检测的应用程序(实体)。

如果您将

entity.guid
设置为 Telemetry SDK 配置中的通用属性,它会将指标链接到应用程序。

String entityGuid = NewRelic.getAgent().getLinkingMetadata().get("entity.guid");
Attributes commonAttributes = new Attributes()
    .put("entity.guid", entityGuid);

或者,您可以使用代理 API(请参阅“创建和累积自定义指标”)。

© www.soinside.com 2019 - 2024. All rights reserved.