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
相关产品推荐
相关产品推荐

