You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

New Relic Java agent的recordMetric无自定义指标数据原因排查

问题:New Relic Java Agent的recordMetric接口无数据上报,但其他API正常

我正在使用New Relic Java agent,尝试通过recordMetric接口记录自定义整数型指标(追踪“每秒事务数”类数据),简化代码如下:

public String simpleFunction() {
    Random ran = new Random();
    NewRelic.recordMetric("Custom/TestData/RequestsPerSecond", ran.nextInt(10, 100));
    return "Hi";
}

但该指标完全未在New Relic平台显示,已确认:

  • New Relic agent配置正确
  • 其他API(recordCustomEvent、noticeError)可正常上报数据并在平台可见
  • 已遵循自定义指标命名规范(以Custom/开头)

尝试过的NRQL查询:

SELECT * FROM Metric 
WHERE metricTimesliceName LIKE 'Custom/TestData%'
SELECT average(newrelic.timeslice.value) 
FROM Metric 
WHERE metricTimesliceName = 'Custom/TestData/RequestsPerSecond' 
SINCE 30 minutes ago TIMESERIES
SELECT average(newrelic.timeslice.value) 
FROM Metric 
WHERE metricTimesliceName = 'Custom/TestData/RequestsPerSecond' 
SINCE 1 hour ago

手动浏览指标也未找到对应数据,明确需要通过recordMetric手动记录而非依赖APM自动生成的吞吐量指标。


可能的原因及解决办法

1. 方法未被New Relic事务追踪包裹

recordMetric接口需要在New Relic监控的事务上下文中调用才会生效。如果你的simpleFunction没有被任何New Relic识别的事务(比如Web请求事务、自定义事务)包裹,指标不会被收集。

解决办法:

  • 如果是Web应用,确保simpleFunction被Web请求触发(比如Spring Controller方法、Servlet方法),这类请求默认会被New Relic标记为事务。
  • 如果是后台任务/非Web场景,手动创建事务包裹方法调用:
public String simpleFunction() {
    // 手动启动事务
    NewRelic.startTransaction();
    try {
        Random ran = new Random();
        NewRelic.recordMetric("Custom/TestData/RequestsPerSecond", ran.nextInt(10, 100));
        return "Hi";
    } finally {
        // 结束事务
        NewRelic.endTransaction();
    }
}

2. 指标被采样过滤或配置拦截

New Relic agent可能通过配置过滤掉了部分自定义指标,或者采样率设置导致数据未上报。

解决办法:

  • 检查agent配置文件(newrelic.yml)中的custom_metrics相关配置,确保没有包含拒绝Custom/TestData/前缀指标的规则:
    custom_metrics:
      # 确保没有类似以下的拒绝规则
      # deny:
      #   - "Custom/TestData/*"
    
  • 确认transaction_tracer或sampling配置没有将该事务的采样率设为0,导致关联的指标被丢弃。

3. NRQL查询的表或字段错误

你使用的Metric表是旧版的指标存储,新版New Relic中,通过recordMetric上报的自定义指标可能存储在Metric或CustomMetric表,且字段名可能有变化。

解决办法:

  • 尝试查询CustomMetric表:
SELECT average(value) FROM CustomMetric WHERE name = 'Custom/TestData/RequestsPerSecond' SINCE 1 hour ago TIMESERIES
  • 或者使用更通用的查询方式查找所有自定义指标:
SELECT * FROM Metric WHERE category = 'Custom' SINCE 1 hour ago

4. 指标类型不匹配导致展示位置错误

recordMetric方法默认上报的是计数值(count)还是计量值(gauge)?如果是计数值,你可能需要在平台的“自定义指标”页面选择正确的聚合方式(比如求和而非平均),或者在查询时使用sum()而非average()。

解决办法:

  • 尝试用求和查询:
SELECT sum(newrelic.timeslice.value) FROM Metric WHERE metricTimesliceName = 'Custom/TestData/RequestsPerSecond' SINCE 1 hour ago TIMESERIES
  • 或者明确指定指标类型(如果使用的是新版API):
// 明确上报为计数值(适合事务数这类累加数据)
NewRelic.recordMetric("Custom/TestData/RequestsPerSecond", MetricType.COUNT, ran.nextInt(10, 100));

内容的提问来源于stack exchange,提问作者JUAN DIEGO DIAZ ACEVEDO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 13:02:31